#ifndef __HEAP_H
#define __HEAP_H

struct heap_t;

/**
* @brief    初始化堆
* @param    heap： 作为堆的句柄返回
* @param    capacity： 堆容量
* @param    compare： 通过传入不通的比较器函数实现大顶堆和小顶堆的切换
* @retval   <0失败，>=0成功
*/
int heap_init(struct heap_t **heap, unsigned int capacity, int (*compare)(int, int));

/**
* @brief    获取当前堆已使用大小
* @param    heap： 对应堆的句柄
* @retval   0空，>=0实际已使用大小
*/
unsigned int heap_get_usedsize(struct heap_t *heap);

/**
* @brief    判满
* @param    heap： 对应堆的句柄
* @retval   0未满，>=0满
*/
int heap_is_full(struct heap_t *heap);

/**
* @brief    判空
* @param    heap： 对应堆的句柄
* @retval   0未空，>=0空
*/
int heap_is_empty(struct heap_t *heap);

/**
* @brief    窥视堆顶元素
* @param    heap： 对应堆的句柄
* @param    value： 存放堆顶元素
* @retval   <0失败，>=0成功
*/
int heap_peek_top(struct heap_t *heap, int *value);

/**
* @brief    窥视堆底元素
* @param    heap： 对应堆的句柄
* @param    value： 存放堆底元素
* @retval   <0失败，>=0成功
*/
int heap_peek_button(struct heap_t *heap, int *value);

/**
* @brief    弹出堆顶元素（弹出后不会堆化，堆顶成为空洞）
* @param    heap： 对应堆的句柄
* @param    value： 存放堆顶元素
* @retval   <0失败，>=0成功
*/
int heap_pop(struct heap_t *heap, int *value);

/**
* @brief    压入堆顶元素
* @param    heap： 对应堆的句柄
* @param    value： 待压入的元素
* @retval   <0失败，>=0成功
*/
int heap_push(struct heap_t *heap, int value);

/**
* @brief    堆排序（若为大顶堆，排序后为小顶堆，若为小顶堆，排序后为大顶堆）
* @param    heap： 对应堆的句柄
* @retval   <0失败，>=0成功
*/
int heap_sort(struct heap_t *heap);

/**
* @brief    插入元素到堆尾
* @param    heap： 对应堆的句柄
* @param    value： 待插入的元素
* @retval   <0失败，>=0成功
*/
int heap_insert(struct heap_t *heap, int value);

/**
* @brief    从堆顶移除元素
* @param    heap： 对应堆的句柄
* @param    value： 存放移除的元素
* @retval   <0失败，>=0成功
*/
int heap_remove(struct heap_t *heap, int *value);

/**
* @brief    销毁创建的堆
* @param    heap： 对应堆的句柄
* @retval   void
*/
void heap_destroy(struct heap_t *heap);

#endif/*__HEAP_H*/
